/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package dominio.controladores;

import dominio.investimentos.Acao;
import dominio.investimentos.Bolsa;
import dominio.investimentos.Operacao;
import dominio.usuarios.Usuario;
import java.util.ArrayList;

/**
 *
 * @author Daniel
 */
public class TratadorAcompanharInvestimento {

    private static TratadorAcompanharInvestimento instancia = null;
    private Usuario usuario;
    private Bolsa bolsa;
    private Operacao operacao;
    //index aponta o índice da acao a ser operada dentro da lista de acoes possuidas pelo usuario
    //index2 aponta o índie da acao a ser operada dentro da lista de acoes da bolsa de valores.
    private int index, index2;
   
    public Bolsa getBolsa() {
        return bolsa;
    }

    public void setBolsa(Bolsa bolsa) {
        this.bolsa = bolsa;
    }

    public int getIndex() {
        return index;
    }

    public void setIndex(int index) {
        this.index = index;
    }

    public int getIndex2() {
        return index2;
    }

    public void setIndex2(int index2) {
        this.index2 = index2;
    }

    public Operacao getOperacao() {
        return operacao;
    }

    public void setOperacao(Operacao operacao) {
        this.operacao = operacao;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    /*
     * Método construtor privado ( Padrão Singleton )
     */
    private TratadorAcompanharInvestimento() {
    }

    /*
     * Ponto de acesso único e global que garante que existirá no máximo uma instancia da classe .
     */
    public static TratadorAcompanharInvestimento obterTratadorAcompanharInvestimento() {
        if (instancia == null) {
            instancia = new TratadorAcompanharInvestimento();
            //chama método que instancia os objetos utilizados no caso de uso            
        }
        return instancia;
    }
        

    /*
     * Método que instancia todos os objetos utilizados na operação Acompanhar Investimento
     */
    public void instanciarObjetos() {
        this.usuario.criarAtributos();
        this.bolsa = new Bolsa();
        this.bolsa.criarAtributos();
    }

    public void escolherOperacao(String tipo) {
        this.operacao = Operacao.obterOperacao(tipo);
    }

    public ArrayList<Acao> listarAcoes() {
        if (this.operacao.getClass().getName().equalsIgnoreCase("dominio.investimentos.operacaovenda")) {
            return usuario.getCarteira().getAcoesPossuidas();
        } else {
            return bolsa.getListaAcoes();
        }
    }

    public Acao escolherAcao(int indice) {
        if (this.operacao.getClass().getName().equalsIgnoreCase("dominio.investimentos.operacaovenda")) {
            return usuario.getCarteira().getAcoesPossuidas().get(indice);
        } else {
            return bolsa.getListaAcoes().get(indice);
        }
    }

    public void informarQtd(int qtd) {
        if (verificarQtd(qtd)) {
            operacao.setQtd(qtd);
        }//TODO
        else {
        }
    }

    /*
     * verifica se a quantidade de ações a serem operadas está de acordo com a regra de validação RV6.5
     */
    public boolean verificarQtd(int qtd) {
        if (operacao.getClass().getName().equalsIgnoreCase("dominio.investimentos.OperacaoVenda")) {
            if (qtd > this.usuario.getCarteira().getAcoesPossuidas().get(this.index).getQtd() || qtd <= 0) {
                return false;
            }
        }
        if (operacao.getClass().getName().equalsIgnoreCase("dominio.investimentos.OperacaoCompra")) {
            if (this.bolsa.getListaAcoes().get(this.index).getQtd() < qtd || qtd <= 0) {
                return false;
            }
        }
        return true;
    }

    public void obterValorTotal() {
        if (operacao.getClass().getName().equalsIgnoreCase("dominio.investimentos.OperacaoVenda"))
            operacao.gerarValorTotal(escolherAcao(index));
        else
            operacao.gerarValorTotal(escolherAcao(index2));
    }

    public boolean confirmarOperacao(boolean confirmacao) {
        if (confirmacao == true)
            return true;
       return false;        
    }

    public void realizarOperacao() { 
        if (operacao.getClass().getName().equalsIgnoreCase("dominio.investimentos.operacaovenda"))
            usuario.realizarOperacao(this.operacao, this.index);
        else
            usuario.realizarOperacao(this.operacao, this.index, escolherAcao(index2));
    }    
}
